#ifndef __TCPCONNECTION_HPP__
#define __TCPCONNECTION_HPP__

#include "Socket.hpp"
#include "SocketIO.hpp"
#include "InetAddress.hpp"

#include <memory>
#include <functional>
using std::shared_ptr;
using std::function;

namespace xww
{
class TcpConnection;
using TcpConnectionPtr = shared_ptr<TcpConnection>;
using TcpConnectionCallback = function<void(TcpConnectionPtr)>;



class TcpConnection
:public std::enable_shared_from_this<TcpConnection>//使得类的成员函数可以安全地创建指向自身的shared_ptr
                                                   //为什么可以这样写？
                                                   //因为std::enable_shared_from_this是一个模板类，接受一个类型参数
                                                   //这里传入的类型参数是TcpConnection
                                                   //所以TcpConnection类继承了std::enable_shared_from_this<TcpConnection>的功能
                                                   //从而可以在TcpConnection类的成员函数中使用shared_from_this()函数
{
    public:
        TcpConnection(int fd);
        ~TcpConnection();
     
        void TsetAllCallback(const TcpConnectionCallback &cb1,
                            const TcpConnectionCallback &cb2,
                            const TcpConnectionCallback &cb3)
        {
            _TonConnection = cb1;
            _TonMessage = cb2;
            _TonClose = cb3;
        }

        string receive();//接收数据
        void send(const string &msg);//发送数据

        bool isClosed() const;//判断连接是否关闭
        void shutdown();//关闭连接
        string toString() const;//获取连接的字符串表示
        
        void handleConnectionCallback();//处理连接回调
        void handleMessageCallback();//处理消息回调
        void handleCloseCallback();//处理关闭连接回调

    private:
        InetAddress getlocalAddr();//取当前地址
        InetAddress getpeerAddr();//获取对端地址

    private:
        Socket _sock; // 套接字对象
        InetAddress _localAddr; // 本地地址对象
        InetAddress _peerAddr; // 对端地址对象
        SocketIO _socketIO; // 套接字输入输出对象

        TcpConnectionCallback _TonConnection; // 连接回调函数
        TcpConnectionCallback _TonMessage; // 消息回调函数
        TcpConnectionCallback _TonClose; // 关闭连接回调函数


};


}//end of namespace xww

#endif